﻿package zf.data.ds.node
{
	/**
	 * 双向链表节点，包含两个指针(prev指向前面节点，next指向后面节点)，一个数据 
	 * @author Mike.zhang
	 * @langversion 3.0 
	 * @playerversion Flash 9 
	 * @see zf.data.ds.DLinkedList
	 */
	public class DListNode
	{
		private var _data:*;
		private var _prev:DListNode;
		private var _next:DListNode;

		/**
		 * 创建双向链表节点 
		 * @param obj 数据
		 * 
		 */
		public function DListNode (obj:*=null)
		{
			_data=obj;
		}
		/**
		 * 节点存储的数据 
		 * @return 数据
		 * 
		 */
		public function get data ():*
		{
			return _data;
		}

		public function set data (v:*):void
		{
			_data=v;
		}

		/**
		 * 指针，一般指向上个节点 
		 * @return 一个双向链表节点
		 * 
		 */
		public function get prev ():DListNode
		{
			return _prev;
		}

		public function set prev (v:DListNode):void
		{
			_prev=v;
		}

		/**
		 * 指针，一般指向下个节点 
		 * @return 一个双向链表节点
		 * 
		 */
		public function get next ():DListNode
		{
			return _next;
		}

		public function set next (v:DListNode):void
		{
			_next=v;
		}
		/**
		 * 在该节点后插入一个节点
		 * @param node 要插入的节点
		 * 
		 */
		public function insertAfter (node:DListNode):void
		{
			node.next=next;
			node.prev=this;
			if (next)
			{
				next.prev=node;
			}
			next=node;
		}
		/**
		 * 在该节点前插入一个节点
		 * @param node 要插入的节点
		 * 
		 */
		public function insertBefore (node:DListNode):void
		{
			node.next=this;
			node.prev=prev;
			if (prev)
			{
				prev.next=node;
			}
			prev=node;
		}
		/**
		 * 断开该节点，如果在链表中断开该节点，那么该节点的前后节点将连接起来 
		 * 
		 */
		public function unlink ():void
		{
			if (prev)
			{
				prev.next=next;
			}
			if (next)
			{
				next.prev=prev;
			}
			prev=next=null;
		}
		/**
		 * 返回该节点的数据描述 
		 * @return 数据描述
		 * 
		 */
		public function toString ():String
		{
			return "" + _data;
		}

	}
}